<?php 

/*  */
class MYSQLClass {

// Определение настроек базы данных


private $defaults = array(
		'dbtype'    => DB_TYPE,
		'host'      => DB_HOST,
		'user'      => DB_USER,
		'pass'      => DB_PASSWORD,
		'dbname'    => DB_DBNAME,
		'tmessages' => DB_TMESSAGES,
		'tcoments'  => DB_TCOMENTS,
		'port'      => NULL,
		'socket'    => NULL,
		'pconnect'  => FALSE,
		'charset'   => 'utf8',
		'errmode'   => 'error', //or exception
		'exception' => 'Exception', //Exception class name
	);

    private $HOSTNAME;
    private $USERNAME;
    private $PASSWORD;
    private $DBNAME;
    private $TMESSAGES;
	private $TCOMENTS;
	private $CHARSET;
	
	private $conn;
	
	
	/**
    * Конструктор класса
    *
    * Устанавливает соединение с базой данных MySQL, выбирает базу и устанавливает кодировку UTF8
    */
  public function __construct()
  {
  	 
		
		$this->HOSTNAME  = $this->defaults['host'];
        $this->USERNAME  = $this->defaults['user'];
        $this->PASSWORD  = $this->defaults['pass'];
        $this->DBNAME    = $this->defaults['dbname'];
        $this->TMESSAGES = $this->defaults['tmessages'];
        $this->TCOMENTS = $this->defaults['tcoments'];
		$this->CHARSET 	 = $this->defaults['charset'];
		
	
	

		
		
  	$conn = mysql_connect(
  			$this->HOSTNAME,
  			$this->USERNAME,
  			$this->PASSWORD
						 )
    	or die ("<br/>Не могу подсоединиться к серверу MySQL". mysql_error());
	
    mysql_select_db(
    		$this->DBNAME,
			
      		$conn
			 	   )
				   
    	or die ("<br/>Не могу получить указанную базу данных". mysql_error());

	mysql_set_charset('UTF8') or die (mysql_error());
	
	$this->install();

	return $conn;

  }
  
  
 
  
    
  /**
   * Деструктор класса
   *
   * Закрывает соединение с базой данных, если оно было установлено
   */
  function __destruct() 
  {
    if ($this->conn)
    mysql_close($link);
  }
  
  
  /**
   * Метод для создания таблиц с сообщениями и комментариями
   *
   * @access private
   */
  
 private function  install()
 {
 	
 	
 	 $sql = "CREATE TABLE IF NOT EXISTS gb_messages
 	 (
 	 		id int(10) unsigned NOT NULL auto_increment,
 	 		datetime datetime NOT NULL,
 	 		name varchar(100) NOT NULL,
 	 		message text NOT NULL,
 	 		PRIMARY KEY (id),
 	 		INDEX (datetime)
 	 )
 	DEFAULT CHARACTER SET  utf8
 	";
 	 $result = mysql_query($sql);
   if (!$result && DEBUGPRINT) {
            $message = 'НЕ верный запрос: ' . mysql_error() . "\n";
            $message .= 'запрос: ' . $query;
            echo "<br>$message";
        }
 	
 	$sql = "CREATE TABLE IF NOT EXISTS gb_coments (
			comentid int(10) unsigned NOT NULL auto_increment,
			comentdatetime datetime NOT NULL,
			comentname varchar(100) NOT NULL,
			coment text NOT NULL,
			messageid varchar(100) NOT NULL,
			PRIMARY KEY (comentid),
			INDEX (comentdatetime)
		)
		DEFAULT CHARACTER SET  utf8
	 	";
 	$result = mysql_query($sql);
 	if (!$result && DEBUGPRINT) {
 		$message = 'НЕ верный запрос: ' . mysql_error() . "\n";
 		$message .= 'запрос: ' . $query;
 		echo "<br>$message";
 	}
 
 } 
  
 /**
  * Метод для подключения к БД
  *
  * @access private
  */
  private function dbconnect() {
  	$conn = mysql_connect(
  			$this->HOSTNAME,
  			$this->USERNAME,
  			$this->PASSWORD
						 )
    	or die ("<br/>Не могу подсоединиться к серверу MySQL". mysql_error());
				
    mysql_select_db(
    		$this->DBNAME,
			
      		$conn
			 	   )
				   
    	or die ("<br/>Не могу получить указанную базу данных". mysql_error());

	mysql_set_charset('UTF8') or die (mysql_error());
  }


   /**
     * Метод для добавления сообщения
     *
     * @access public
     * @param String $message текст сообщения
     * @param String $name имя автора сообщения
     * @return Boolean TRUE в случае успешного завершения метода, иначе - FALSE
     */
    public function addMessage($message, $name) {
        if (!is_string($message) || !is_string($name) || empty($message) || empty($name) ) {
             if (DEBUGPRINT) {
                echo ('<br>addMessage: не верный тип данных');
                echo ('<br>$message is ' . gettype($message));
                echo ('<br>$name is ' . gettype($name));
             }
            return FALSE;                        
        }
        $success = $this->insertIntoTable(
                $this->TMESSAGES,
                'message, name, datetime ',
                $this->SaveString($message) . ", " .
                $this->SaveString($name) .
                ", NOW()");
        
        if ($success && DEBUGPRINT)
            echo "<br>Сообщение добавлено.\n";
        else if (DEBUGPRINT)
            echo "<br>Ошибка при добавлении сообщения.\n";
        return $success;
    }
  
    /**
     * Метод для удаления сообщения
     *
     * @access public
     * @param Numeric $id id сообщения
     * @return Boolean TRUE в случае успешного завершения метода, иначе - FALSE
     */
     public function  DelMessage($id)
	 {
       if (!is_numeric($id)) {
            if (DEBUGPRINT)  {
                echo ('<br>deleteMessage: wrong argument type');
                echo ('<br>$id is ' . gettype($id));
            }
            return FALSE;
        }
	   echo "Удалили собщение";
			 
	    echo "deleteRowsFromTable";
        $success = $this->deleteRowsFromTable(
                $this->TMESSAGES,
                "id =". $id);
        
		 echo "deleteRowsFromTable";
		$success = $this->deleteRowsFromTable(
                $this->TCOMENTS,
                "messageid =". $id);
		 echo "deleteRowsFromTable";
		 
        if ($success && DEBUGPRINT)
            echo "<br>Сообщение удалено.\n";
        else if (DEBUGPRINT)
            echo "<br>Ошибка: сообщение не было удалено\n";
        return $success;
        
        
        }
   /**
     * Метод для удаления комментария
     *
     * @access public
     * @param Numeric $id id комментария
     * @return Boolean TRUE в случае успешного завершения метода, иначе - FALSE
     */
     public function  DelComent($id)
	 {
       if (!is_numeric($id)) {
            if (DEBUGPRINT)  {
                echo ('<br>DelComent: wrong argument type');
                echo ('<br>$id is ' . gettype($id));
            }
            return FALSE;
        }
		$success = $this->deleteRowsFromTable(
                $this->TCOMENTS,
                "comentid =". $id);

		 
        if ($success && DEBUGPRINT)
            echo "<br>Комментарий удален.\n";
        else if (DEBUGPRINT)
            echo "<br>Ошибка: комментарий не был удален\n";
        return $success;
               
        }
  
  
  
  
  
     /**
     * Метод для добавления комментария
     *
     * @access public $messageid, $coment, $comentname
     * @param Integer $messageid ID сообщения
	 * @param String $coment тект комментария
     * @param String $comentname имя автора комментария
     * @return Boolean TRUE в случае успешного завершения метода, иначе - FALSE
     */
    public function addComent($messageid, $coment, $comentname) {
        	
			echo $messageid;
			echo $coment;
			echo $comentname;
			echo '----------------------------------';
        if (!is_integer($messageid) || !is_string($coment) || empty($comentname) || empty($coment) || empty($messageid) ) {
             if (DEBUGPRINT) {
                echo ('<br>addComent: не верный тип данных');
                echo ('<br>$messageid is ' . gettype($messageid));
                echo ('<br>$coment is ' . gettype($coment));
				echo ('<br>$comentname is ' . gettype($comentname));
             }
            return FALSE;                        
        }
        $success = $this->insertIntoTable(
                $this->TCOMENTS,
                'messageid, coment, comentname, comentdatetime ',
                $messageid . " , ".
                $this->SaveString($coment) . "," .
                $this->SaveString($comentname) .
                ", NOW()");
        
        if ($success && DEBUGPRINT)
            echo "<br>Комментарий добавлен добавлено.\n";
        else if (DEBUGPRINT)
            echo "<br>Ошибка при добавлении комментария.\n";
            
    
        return $success;
	  
	  /*$this->insertIntoTable(
                $this->TCOMENTS,
                'messageid, coment, comentname, comentdatetime ',
                " '26','Привте!!!!','Сережа', NOW()");
	 // INSERT INTO `gb_base`.`gb_coments` (`comentid`, `comentdatetime`, `comentname`, `coment`, `messageid`) VALUES (NULL, NOW(), 'Сережа', 'Привте!!!!', '27'); */
	 
    }
    
    /**
     * Метод для получения сообщения из БД
     * @access public
     * @return $rows array в случае успешного завершения метода, иначе - FALSE
     */
  public function getmessages()
  {
	
	      $rows = array();
		$sqlresult = $this->selectRowsFromTable(
                $this->TMESSAGES,
                '*',
                '', 
                'datetime DESC');
    
	    while ($rows[] = mysql_fetch_array($sqlresult));
        array_pop($rows);
        return $rows;
		
  }
  
  /**
   * Метод для получения сообщения из БД по его ID
   *
   * @access public
   * param Numeric $id сообщения
   * @return $rows array в случае успешного завершения метода
   */
  
  public function getMessage($messageid)
  {
	    $rows = array();
		$sqlresult = $this->selectRowsFromTable(
                $this->TMESSAGES,
                '*',
                'ID='.$messageid, 
                '');
    
	   while ($rows[] = mysql_fetch_array($sqlresult));
        array_pop($rows);
        return $rows;
  }

  /**
   * Метод для изменения сообщения
   *
   * @access public $messageid, $message, $name
   * @param Integer $messageid ID сообщения
   * @param String $message текcт сообщения
   * @param String $name имя автора сообщения
   * @return Boolean TRUE в случае успешного завершения метода, иначе - FALSE
   */
  
  public function  change_message($messageid, $message, $name)
  {
  	   if (!is_numeric($messageid) || 
            !is_string($message)       || 
            !is_string($name)) {
             if (DEBUGPRINT) {
                echo ('<br>updateMessage: wrong argument type');
                echo ('<br>$messageid is ' . gettype($messageid));
                echo ('<br>$message is ' . gettype($message));
                echo ('<br>$name is ' . gettype($name));
             }
            return FALSE;
            }            
        $success = $this->updateRowsFromTable(
                $this->TMESSAGES,
                "message = " . $this->SaveString($message." Cообщение было изменено: ".date('Y-m-d [H:i:s]')).
                ", name = " . $this->SaveString($name),
                "id = ". $messageid);
        if ($success && DEBUGPRINT)
            echo "<br>Сообщение изменено.\n";
        else if (DEBUGPRINT)
            echo "<br>Error: сообщение не изменено.\n";
        return $success;
	
  }
  
  /**
   * Метод для изменения комментария
   *
   * @access public $messageid, $coment, $comentname
   * @param Integer $messageid ID сообщения
   * @param String $coment тект комментария
   * @param String $comentname имя автора комментария
   * @return Boolean TRUE в случае успешного завершения метода, иначе - FALSE
   */
  public function  change_coment($messageid, $message, $name)
  {
  	   if (!is_numeric($messageid) || 
            !is_string($message)       || 
            !is_string($name)) {
             if (DEBUGPRINT) {
                echo ('<br>updateMessage: wrong argument type');
                echo ('<br>$messageid is ' . gettype($messageid));
                echo ('<br>$message is ' . gettype($message));
                echo ('<br>$name is ' . gettype($name));
             }
            return FALSE;
            }            
        $success = $this->updateRowsFromTable(
                $this->TCOMENTS,
                "coment = " . $this->SaveString($message." Комментарий был изменен: ".date('Y-m-d [H:i:s]')).
                ", comentname = " . $this->SaveString($name),
                "comentid = ". $messageid);
        if ($success && DEBUGPRINT)
            echo "<br>Сообщение изменено.\n";
        else if (DEBUGPRINT)
            echo "<br>Error: сообщение не изменено.\n";
        return $success;
	
  }
  
  /**
   * Метод для полученяи всех комментарий сообщеняи по его ID
   *
   * @access public $messageid
   * @param Integer $messageid ID сообщения
   * @return $rows array в случае успешного завершения метода
   */
  
  public function getAllComents($messageid)
  {
	
	      $rows = array();
		  $sqlresult = $this->selectRowsFromTable(
                $this->TCOMENTS,
                '*',
                'messageid = ' . $messageid,
                'comentdatetime ASC');
    
	    while ($rows[] = mysql_fetch_array($sqlresult));
        array_pop($rows);
        return $rows;
		
  }
  
  
  
  /**
   * Метод для получения комментария по его ID
   *
   * @access public $messageid
   * @param Integer $messageid ID сообщения
   * @return $rows array в случае успешного завершения метода
   */
  
  public function getComments($messageid)
  {
	
	      $rows = array();
		  $sqlresult = $this->selectRowsFromTable(
                $this->TCOMENTS,
                '*',
                'comentid = ' . $messageid,
                '');
				
				echo $sqlresult;
    
	    while ($rows[] = mysql_fetch_array($sqlresult));
        array_pop($rows);
        return $rows;
		
  }
  
  
  
  /**
   * Метод для изменения строк таблицы
   *
   * @access private
   * @param String $tablename Имя таблицы, из которой происходит выборка
   * @param String $setcolumns содержит список столбцов через запятую
   * @param String $clause содержит список всех условий, по умолчанию пустой (выводятся все строки)
   * @return $result в случае успешного завершения метода, иначе - FALSE
   */
  
  private function updateRowsFromTable($tablename, $setcolumns = '', $clause = '')
  {
  	if (!is_string($tablename)  ||
        !is_string($setcolumns) || 
        !is_string($clause)) return FALSE;
        
        if (empty($setcolumns) && DEBUGPRINT) {
            echo '<br>Update query failed: @param setcolumns missing' . "\n";
            return FALSE;
        }
        if (!empty($clause))
            $whereclause = 'WHERE ' . $clause;
        else
        $whereclause = '';
        $query = sprintf(
                "UPDATE %s SET %s %s",
                ($tablename),
                ($setcolumns),
                ($whereclause));

        // Выполняем запрос
        $result = mysql_query($query);

        // Проверяем результат
        if (!$result && DEBUGPRINT) {
            $message = 'Неверный запрос: ' . mysql_error() . "\n";
            $message .= 'Запрос: ' . $query;
            echo "<br>$message";
        }
        return $result;
	
	
  }
  
  
  
  
    /**
     * Метод для выбора строк из таблицы
     *
     * @access private
     * @param String $tablename Имя таблицы, из которой происходит выборка
     * @param String $columns содержит список столбцов через запятую, по умолчанию выводятся все столбцы ('*')
     * @param String $clause содержит список всех условий, по умолчанию пустой (выводятся все строки)
     * @param String $orderby содержит список условий упорядочивания результатов запроса, по умолчанию пустой
     * @return Resource в случае успешного завершения метода, иначе - FALSE
     */
    private function selectRowsFromTable($tablename, $columns = '*', $clause = '', $orderby = '') {
        	  	if (DEBUGPRINT) echo '<br> DB selectRowsFromTable';
			
        if (!is_string($tablename) || 
            !is_string($columns)   || 
            !is_string($clause)    || 
            !is_string($orderby)) {
             if (DEBUGPRINT) {
                echo ('<br>selectRowsFromTable: wrong argument type');
                echo ('<br>$tablename is ' . gettype($tablename));
                echo ('<br>$columns is ' . gettype($columns));
                echo ('<br>$clause is ' . gettype($clause));
                echo ('<br>$orderby is ' . gettype($orderby));
            }
            return FALSE;
           }
        
        if (!empty($clause))
            $whereclause = 'WHERE ' . ($clause);
        else
            $whereclause = '';
        if (!empty($orderby))
            $orderclause = 'ORDER BY ' . ($orderby);
        else
            $orderclause = '';
		if (DEBUGPRINT) {
			 echo ('<br>Параметры');
                echo ('<br>$whereclause is ' . $whereclause);
                echo ('<br>$orderclause is ' . $orderclause);
                echo ('<br>$columns is ' . $columns);
		}
		
        $query = sprintf(
                "SELECT %s FROM %s %s %s", 
                ($columns),
                ($tablename),
                $whereclause, $orderclause);

        // Выполняем запрос
        $result = mysql_query($query);

        // Проверяем результат
        // Показываем ошибку MySQL и ошибочный запрос. Полезно для отладки
        if (!$result && DEBUGPRINT) {
            $message = 'НЕ верный запрос: ' . mysql_error() . "\n";
            $message .= 'запрос: ' . $query;
            echo "<br>$message";
        }
        return $result;
    }
  
    
    /**
     * Метод для вставки строк в таблицы
     *
     * @access private
     * @param String $tablename Имя таблицы, из которой происходит выборка
     * @param String $columnames содержит список столбцов через запятую, по умолчанию выводятся все столбцы ('*')
     * @param String $columnvalues содержит список всех значений
     * @return $result в случае успешного завершения метода, иначе - FALSE
     */
    
    
  private function insertIntoTable($tablename, $columnnames = '', $columnvalues = '') {
        if (!is_string($tablename)   || 
            !is_string($columnnames) || 
            !is_string($columnvalues)) return FALSE;
        
        $query = sprintf(
                "INSERT INTO `%s` (%s) VALUES (%s)",
                $tablename,
                $columnnames,
                $columnvalues);

        $result = mysql_query($query);

        // Проверка результата
        if (!$result && DEBUGPRINT) {
            $message = 'НЕ верный запрос: ' . mysql_error() . "\n";
            $message .= 'запрос: ' . $query;
            echo "<br>$message";
        }
        return $result;
    }
  
  
    /**
     * Метод для удаления строк из таблицы
     *
     * @access private
     * @param String $tablename Имя таблицы, из которой происходит выборка
     * @param String $clause содержит список всех условий, по умолчанию пустой (выводятся все строки)
     * @return $result в случае успешного завершения метода, иначе - FALSE
     */
         private function deleteRowsFromTable($tablename, $clause = '') {
        if (!is_string($tablename) || !is_string($clause)) return FALSE;
        $whereclause = '';
        if (!empty($clause))
            $whereclause = 'WHERE ' . $clause;
        else
            $whereclause = '';
        $query = sprintf(
                "DELETE FROM %s %s",
                $tablename,
                $whereclause);

        // Выполняем запрос
        $result = mysql_query($query);

        // Проверяем результат
        // Показываем ошибку MySQL и ошибочный запрос. Полезно для отладки
        if (!$result && DEBUGPRINT) {
            $message = 'НЕ верный запрос: ' . mysql_error() . "\n";
            $message .= 'запрос: ' . $query;
            echo "<br>$message";
        }
        return $result;
    }
 
 
 
 
    /**
     * Метод для удаления из строк мусора, тегов, запросов.
     *
     * @access private
     * @param String $sstring строка
     * @return $sstring в случае успешного завершения метода, иначе - пусто
     */
       private function SaveString($sstring) {
        if (is_string($sstring))
		{
    	$sstring = trim($sstring);
		$sstring = htmlspecialchars($sstring);
		//$sstring = stripslashes($sstring);
		$sstring = nl2br($sstring);
		//$sstring = strip_tags($sstring);
	
		
		//TODO ЗАМЕНА ИЗ СПИСКА ПОДСТАНОВКИ		
		
		
		
		
		return "'" . $sstring . "'";	
		}
        return "''";        
    }
    
  
}